gusucode.com > 支持向量机工具箱 - LIBSVM OSU_SVM LS_SVM源码程序 > 支持向量机工具箱 - LIBSVM OSU_SVM LS_SVM\stprtool\bayes\bayeserr.m

    function [risk,eps1,eps2,inter1]=bayeserr(p1,m1,m2,c1,c2)
% BAYESERR computes the Bayesian risk for optimal classifier.
% [risk,eps1,eps2,inter1]=bayeserr(p1,m1,m2,c1,c2)
%
% BAYESERR computes a value of the Bayesian risk for the 0/1-cost
%  function and an optimal Bayesian classifier minimizing the 
%  risk. The binary clasification problem is supposed, where 
%  the conditional probabilities are one-dimensional Gaussians 
%  p(x|k=1)=N(m1,c1) and p(x|k=2)=N(m2,c2). 
%
% Input:
%  p1 [0<=p1<=1]      Apriori probability of the first class.
%  m1 [real]          Mean value of the Gaussian p(x|k=1)=N(m1,c1).
%  m2 [real]          Mean value of the Gaussian p(x|k=2)=N(m2,c2).
%  c1 [positive real] Variance of the Gaussian p(x|k=1)=N(m1,c1).
%  c2 [positive real] Variance of the Gaussian p(x|k=2)=N(m2,c2).
%
% Output:
%  risk [positive real] Bayesian risk for an optimal classifier.
%  eps1 [positive real] Integral of p(x|k=1) over x in L2, where
%    L2 is an arrea where x is classified to the 2nd class.
%  eps2 [positive real] Integral of p(x|k=1) over x in L1, where
%    L1 is an arrea where x is classified to the 1nd class.
%  inter1 [1x2] or [1x4] One or two intervals describing L1.
%
% See also BAYES.

% Statistical Pattern Recognition Toolbox, Vojtech Franc, Vaclav Hlavac
% (c) Czech Technical University Prague, http://cmp.felk.cvut.cz
% Modifications:
% 27-Oct-2001, V.Franc


% p2 is uniquely determined since p1+p2=1.
p2=1-p1;

% finds out decision function which is generaly quadratic
[a,b,c]=bayesnd(p1,p2,m1,m2,c1,c2);


% Splits X into X1 and X2 according to the computed quadratic 
% discriminat function ax^2 + bx + c = 0 and computes 
% eps1 and eps2.

if a==0,
   % The decision function is linear, i.e. in 1D it is a
   % single threshold.
   th=-c/b;
   inter1=[th,inf];
   
   % gets label for the interval (th,inf)
   class=classify(th+1,p1,p2,m1,m2,c1,c2);
   
   if abs(c)==inf,
     risk=0;
     if class==1,,
       eps1=0;
       eps2=1;
       inter1=[-inf,inf];
       return;
     else
      eps1=1;
      eps2=0;
      inter1=[];
     end
   end   
      
   eps1=1-erfc2(th,m1,sqrt(c1));
   eps2=erfc2(th,m2,sqrt(c2));  
         
   if class==2,
      % swap eps1 and eps2
      tmp=eps2;
      eps2=eps1;
      eps1=tmp;
   end
   
else
   % The decision function is quadratic, i.e. in 2d
   % there exis two thresholds which determine three intervals.
   
   D=b^2-4*a*c;
   if D > 0,
      th1=(-b-sqrt(D))/(2*a);
      th2=(-b+sqrt(D))/(2*a);
      
      if th1 > th2,
         tmp=th1;
         th1=th2;
         th2=tmp;         
      end;
      
      % finds out label for the interval [th1,th2].
      class=classify((th2+th1)/2,p1,p2,m1,m2,c1,c2);
      
      if class==2
         % integral eps2 = int_th2^inf + int_{-inf}^th1
         eps2 = 1 + erfc2(th2,m2,sqrt(c2)) - erfc2(th1,m2,sqrt(c2));          
         % integral eps1= int_th1^th2
         eps1 = erfc2(th1,m1,sqrt(c1)) - erfc2(th2,m1,sqrt(c1));         
         
         inter1=[-inf,th1,th2,inf];
      else
         % integral eps1 = int_th2^inf + int_{-inf}^th1
         eps1 = 1 + erfc2(th2,m1,sqrt(c1)) - erfc2(th1,m1,sqrt(c1));  
         % integral eps2= int_th1^th2
         eps2=erfc2(th1,m2,sqrt(c2))-erfc2(th2,m2,sqrt(c2));
         
         inter1=[th1,th2];
      end
      
   else
      % finds out label for the interval [-inf,inf].
      class=classify(0,p1,p2,m1,m2,c1,c2);
      
      if class == 1,
         eps1=0;
         eps2=1;
         inter1=[-inf,inf];
      else
         eps1=1;
         eps2=0;
         inter1=[];
      end
      risk=0;
      return;
   end
end

% computes the Bayesian risk 
risk = p1*( eps1 - eps2 ) + eps2;

return;

%-----------------------------------------------
function class = classify(x,p1,p2,m1,m2,c1,c2)
% finds out to which class the given x belongs

if p1==1,     % only the 1st class is possible
   class=1;
elseif p2==1, % only the 2nd class is possible
   class=2;
elseif normald(x,m1,c1)*p1 > normald(x,m2,c2)*p2,
   class=1;
else
   class=2;
end

return;